package auxiliadormatricula;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.Button;
import android.widget.LinearLayout;
import auxiliadormatricula.componentes.R;

public class ADMMain extends Activity {
	enum Estado {
		CURSANDO,
		PAGO,
		NAOPAGO
	};
	
	class MyOnClickListener implements View.OnClickListener {
		public void onClick(View v) {
			Button b = (Button)findViewById(v.getId());
			Cadeira c = cadeiras.get(b.getText());
			switch(c.estado) {
			case CURSANDO:
				c.estado=Estado.PAGO;
				break;
			case PAGO:
				c.estado=Estado.NAOPAGO;
				break;
			case NAOPAGO:
				c.estado=Estado.CURSANDO;
				break;
			}
			atualizar();
		}
	}
	
	class Cadeira {
		public List<String> preRequisitos;
		public String nome;
		boolean opcional;
		Estado estado;
		boolean disponivel;
		public Cadeira(String n) {
			preRequisitos = new ArrayList<String>();
			nome = n;
			estado=Estado.NAOPAGO;
			disponivel=true;
		}
		public boolean calcularDisponibilidade(Map<String, Cadeira> mapa) {
			if(estado==Estado.NAOPAGO){
				boolean r = true;
				for(String n : preRequisitos) {
					Cadeira c = mapa.get(n);
					if(c!=null) {
						if(c.estado != Estado.PAGO) {
							r = false;
							break;
						}
					} else {
						Log.w("!!", "calcularDisponibilidade null request");
						break;
					}
				}
				disponivel=r;
			} else {
				disponivel=false;
			}
			return disponivel;
		}
	}
	
	public String[][] nomesCadeiras = {{
			"P1",
			"LP1",
			"IC",
			"CDI1",
			"AVGA",
			"LPT"},
			//
			{"P2",
			"LP2",
			"TG",
			"CDI2",
			"MD",
			"MC",
			"FFC"},{
			//
			"EDA",
			"LEDA",
			"AL",
			"PE",
			"TC",
			"FFM",
			"GI"},{
			//
			"OAC",
			"LOAC",
			"PLP",
			"LM",
			"ME",
			"SI1",
			"ES"},{
			//
			"ATAL",
			"RC",
			"BD1",
			"C",
			"SI2",
			"LES",
			"IS"},{
			//
			"SO",
			"IRC",
			"LIRC",
			"IA",
			"BD2",
			"OP1",
			"OP2",
			"DC"},{
			//
			"MSN",
			"ADSD",
			"OP3",
			"OP4",
			"OP5",
			"PC1",
			"OP6"},{
			//
			"OP7",
			"OP8",
			"OP9",
			"OP10",
			"OP11",
			"PC2"}
			
            };
	
	Map<String, Button> botoes = new TreeMap<String, Button>();
	Map<String, Cadeira> cadeiras = new TreeMap<String, Cadeira>();
	
	//public Grade gradePadrao = new Grade();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admmain);
        //LinearLayout layout = (LinearLayout)findViewById(R.id.linearLayout1);
        criarCadeiras();
        popularPreRequisitos();
        //popularLayout(layout);
    }  
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
    	if(cadeiras.get(((Button)findViewById(v.getId())).getText().toString()).disponivel) {
	    	super.onCreateContextMenu(menu, v, menuInfo);
			menu.setHeaderTitle("Estado");
			menu.add(0, v.getId(), 0, "Cursando");
			menu.add(0, v.getId(), 0, "Pago");
			menu.add(0, v.getId(), 0, "Nao Pago");
    	}
	}
    @Override  
    public boolean onContextItemSelected(MenuItem item) {
    	Button b = (Button)findViewById(item.getItemId());
    	Cadeira c = cadeiras.get((String)b.getText());
    	if(item.getTitle()=="Cursando")
			c.estado=Estado.CURSANDO;
    	else if(item.getTitle()=="Pago")
			c.estado=Estado.PAGO;
    	else if(item.getTitle()=="Nao Pago")
			c.estado=Estado.NAOPAGO;
    	else
    		return false;
    	atualizar();
    	return true;
	}
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.layout.activity_admmain, menu);
        return true;
    }
    private void atualizar(String cadeira) {
		cadeiras.get(cadeira).calcularDisponibilidade(cadeiras);
		botoes.get(cadeira).setTextColor(cadeiras.get(cadeira).disponivel ? Color.GREEN : (cadeiras.get(cadeira).estado==Estado.CURSANDO?Color.WHITE:Color.RED));
    }
    private void atualizar() {
    	for(String[] bloco : nomesCadeiras)
    		for(String cadeira : bloco)
    			atualizar(cadeira);
    }
    private void popularLayout(LinearLayout layout) {
        int id = 0;
        for(String[] bloco : nomesCadeiras) {
        	LinearLayout l = new LinearLayout(this);
        	l.setOrientation(LinearLayout.VERTICAL);
        	for(String cadeira : bloco) {
        		Button b = new Button(this);
        		botoes.put(cadeira, b);
        		cadeiras.get(cadeira).calcularDisponibilidade(cadeiras);
        		b.setText(cadeira);
                try {
               	 b.setTextColor(cadeiras.get(cadeira).disponivel ? Color.GREEN : Color.RED);
                } catch (Exception e) {
               	 b.setTextColor(Color.WHITE);
                }
                b.setId(id++);
                b.setOnClickListener(new MyOnClickListener());
                registerForContextMenu(b);
            	l.addView(b);
        	}
        	layout.addView(l);
        }
	}
	private void criarCadeiras() {
        for(String[] bloco : nomesCadeiras)
        	for(String cadeira : bloco) {
        		Cadeira c = new Cadeira(cadeira);
        		cadeiras.put(cadeira, c);
        	}
	}
	private void popularPreRequisitos() {
		try{
        cadeiras.get("P2").preRequisitos.add("P1");
        cadeiras.get("P2").preRequisitos.add("LP1");
        cadeiras.get("P2").preRequisitos.add("IC");
        cadeiras.get("LP2").preRequisitos.add("P1");
        cadeiras.get("LP2").preRequisitos.add("LP1");
        cadeiras.get("LP2").preRequisitos.add("IC");
        cadeiras.get("TG").preRequisitos.add("P1");
        cadeiras.get("TG").preRequisitos.add("LP1");
        cadeiras.get("CDI2").preRequisitos.add("CDI1");
        cadeiras.get("FFC").preRequisitos.add("CDI1");
        cadeiras.get("FFC").preRequisitos.add("AVGA");

        cadeiras.get("EDA").preRequisitos.add("P2");
        cadeiras.get("EDA").preRequisitos.add("LP2");
        cadeiras.get("EDA").preRequisitos.add("TG");
        cadeiras.get("LEDA").preRequisitos.add("P2");
        cadeiras.get("LEDA").preRequisitos.add("LP2");
        cadeiras.get("LEDA").preRequisitos.add("TG");
        cadeiras.get("AL").preRequisitos.add("AVGA");
        cadeiras.get("PE").preRequisitos.add("CDI2");
        cadeiras.get("TC").preRequisitos.add("TG");
        cadeiras.get("TC").preRequisitos.add("IC");
        cadeiras.get("TC").preRequisitos.add("MD");
        cadeiras.get("FFM").preRequisitos.add("CDI2");
        cadeiras.get("FFM").preRequisitos.add("FFC");

        cadeiras.get("OAC").preRequisitos.add("EDA");
        cadeiras.get("OAC").preRequisitos.add("LEDA");
        cadeiras.get("OAC").preRequisitos.add("FFM");
        cadeiras.get("LOAC").preRequisitos.add("EDA");
        cadeiras.get("LOAC").preRequisitos.add("LEDA");
        cadeiras.get("LOAC").preRequisitos.add("FFM");
        cadeiras.get("PLP").preRequisitos.add("EDA");
        cadeiras.get("PLP").preRequisitos.add("LEDA");
        cadeiras.get("PLP").preRequisitos.add("TC");
        cadeiras.get("ME").preRequisitos.add("AL");
        cadeiras.get("ME").preRequisitos.add("PE");
        cadeiras.get("LM").preRequisitos.add("TC");
        cadeiras.get("SI1").preRequisitos.add("GI");
        cadeiras.get("ES").preRequisitos.add("P2");
        cadeiras.get("ES").preRequisitos.add("LP2");
        cadeiras.get("ES").preRequisitos.add("PE");

        cadeiras.get("ATAL").preRequisitos.add("EDA");
        cadeiras.get("ATAL").preRequisitos.add("LEDA");
        cadeiras.get("ATAL").preRequisitos.add("CDI2");
        cadeiras.get("ATAL").preRequisitos.add("LM");
        cadeiras.get("RC").preRequisitos.add("OAC");
        cadeiras.get("RC").preRequisitos.add("LOAC");
        cadeiras.get("C").preRequisitos.add("OAC");
        cadeiras.get("C").preRequisitos.add("LOAC");
        cadeiras.get("C").preRequisitos.add("PLP");
        cadeiras.get("BD1").preRequisitos.add("SI1");
        cadeiras.get("SI2").preRequisitos.add("SI1");
        cadeiras.get("LES").preRequisitos.add("ES");

        cadeiras.get("SO").preRequisitos.add("OAC");
        cadeiras.get("SO").preRequisitos.add("LOAC");
        cadeiras.get("IRC").preRequisitos.add("RC");
        cadeiras.get("LIRC").preRequisitos.add("RC");
        cadeiras.get("IA").preRequisitos.add("ATAL");
        cadeiras.get("IA").preRequisitos.add("PLP");
        cadeiras.get("IA").preRequisitos.add("ME");
        cadeiras.get("BD2").preRequisitos.add("BD1");
        cadeiras.get("BD2").preRequisitos.add("SI2");
        
        cadeiras.get("MSN").preRequisitos.add("ATAL");
        cadeiras.get("MSN").preRequisitos.add("AL");
        cadeiras.get("ADSD").preRequisitos.add("PE");
        cadeiras.get("PC1").preRequisitos.add("MC");
        cadeiras.get("PC1").preRequisitos.add("LES");

        cadeiras.get("PC2").preRequisitos.add("PC1");
		} catch (Exception e) {
			Log.w("!!", e.getMessage());
		}
	}
}
